﻿using Cotizav.Presentacion.WinForms.Equipo;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Cotizav.Presentacion.WinForms.Cotizacion.Cotizacion.Equipo
{
    public partial class Cotizacion_AgregarEquipo_Venta : Form
    {
        string moneda;
        decimal tipoCambio;
        List<Entidades.CotizacionDetalle> listaCotizacionDetalle;

        private Entidades.CotizacionDetalle result;

        public Entidades.CotizacionDetalle Result
        {
          get { return result; }
          set { result = value; }
        }

        public Cotizacion_AgregarEquipo_Venta()
        {
            InitializeComponent();
        }

        public Cotizacion_AgregarEquipo_Venta(string m, decimal tc, List<Entidades.CotizacionDetalle> lista) : this()
        {
            moneda = m;
            tipoCambio = tc;
            listaCotizacionDetalle = lista;
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            BuscarEquipo iuDialog = new BuscarEquipo();
            DialogResult dr = iuDialog.ShowDialog();

            if (dr == DialogResult.OK)
            {
                Entidades.Equipo selectedEquipo = iuDialog.Result;

                if (selectedEquipo != null)
                {

                    Entidades.CotizacionDetalle query = listaCotizacionDetalle.Find(x => x.CodigoEquipo.Trim().Equals(selectedEquipo.CodigoEquipo.Trim()));

                    if (query == null)
                    {

                        txtBusqueda.Text = selectedEquipo.NombreEquipo;
                        txtBusqueda.Tag = selectedEquipo;

                        //listamos sus caracteristicas
                        LogicaNegocio.CaracteristicaBLL caracteristicaBLL = new LogicaNegocio.CaracteristicaBLL();
                        List<Entidades.Caracteristica> listaCaracteristica = caracteristicaBLL.Listar(selectedEquipo);

                        gridEspecTecnicas.DataSource = null;
                        gridEspecTecnicas.DataSource = listaCaracteristica;
                        gridEspecTecnicas.ClearSelection();

                        //cargamos las tarifas
                        LogicaNegocio.ListaTarifaBLL listaTarifaBLL = new LogicaNegocio.ListaTarifaBLL();
                        Entidades.ListaTarifa listaTarifa = listaTarifaBLL.Listar(selectedEquipo);
                        gbTarifas.Tag = listaTarifa;
                    }
                    else
                    {
                        MessageBox.Show("El equipo ya se encuentra en el detalle de la cotización.", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    }
                }
            }
        }

        private void gridEspecTecnicas_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (gridEspecTecnicas.DataSource != null)
            {
                gridEspecTecnicas.Columns["IdCaracteristica"].Visible = false;
                gridEspecTecnicas.Columns["IdEquipo"].Visible = false;
                gridEspecTecnicas.Columns["NombreCaracteristica"].HeaderText = "Caracteristica";
                gridEspecTecnicas.Columns["Descripcion"].HeaderText = "Descripción";
                gridEspecTecnicas.Columns["Statusflag"].Visible = false;
                gridEspecTecnicas.Columns["Activo"].Visible = false;
            }
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            bool correcto = false;

            if (txtBusqueda.Tag != null)
            {
                if (!string.IsNullOrWhiteSpace(txtCantidad.Text))
                {
                    if (!string.IsNullOrWhiteSpace(txtPrecio.Text))
                    {
                        if (!string.IsNullOrWhiteSpace(txtValorNeto.Text))
                        {
                            if (!string.IsNullOrWhiteSpace(txtValorIGV.Text))
                            {
                                if (!string.IsNullOrWhiteSpace(txtMontoTotal.Text))
                                {
                                    if (gridEspecTecnicas.Rows.Count > 0)
                                    {
                                        correcto = true;
                                    }
                                    else
                                    {
                                        DialogResult dr = MessageBox.Show("El Equipo no tiene características. ¿Continúa agregando el equipo?", "Cotizav", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);

                                        if (dr == DialogResult.OK)
                                        {
                                            correcto = true;
                                        }
                                    }
                                }
                                else
                                {
                                    MessageBox.Show("Ingrese valor en campo Monto Total", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                                }
                            }
                            else
                            {
                                MessageBox.Show("Ingrese valor en campo I.G.V.", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                            }
                        }
                        else
                        {
                            MessageBox.Show("Ingrese valor en campo Valor venta.", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                        }
                    }
                    else
                    {
                        MessageBox.Show("Ingrese valor en campo Precio.", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    }
                }
                else
                {
                    MessageBox.Show("Ingrese valor en campo Cantidad.", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
            }
            else
            {
                MessageBox.Show("Seleccione el equipo para agregar a la cotización.", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }

            if (correcto)
            {
                int cantidad = Int32.Parse(txtCantidad.Text);
                decimal preciounitario = decimal.Parse(txtPrecio.Text);
                decimal preciounitarioExt = moneda.ToUpper().Equals("EXTRANJERA") ? decimal.Parse(txtPrecio.Text) : (decimal.Parse(txtPrecio.Text) * tipoCambio);
                decimal preciounitarioLoc = moneda.ToUpper().Equals("LOCAL") ? decimal.Parse(txtPrecio.Text) : (decimal.Parse(txtPrecio.Text) / tipoCambio);
                
                Entidades.CotizacionDetalle newCotizacionDetalle =
                    new Entidades.CotizacionDetalle()
                    {
                        IdEquipo = (txtBusqueda.Tag as Entidades.Equipo).IdEquipo,
                        NombreEquipo = (txtBusqueda.Tag as Entidades.Equipo).NombreEquipo,
                        CodigoEquipo = (txtBusqueda.Tag as Entidades.Equipo).CodigoEquipo,
                        Alternativa = 0,  //principal
                        Moneda = moneda,
                        Cantidad = !string.IsNullOrWhiteSpace(txtCantidad.Text) ? int.Parse(txtCantidad.Text) : new Nullable<int>() ,
                        SerieEquipo = txtSerie.Text,
                        HorasEquipo = !string.IsNullOrWhiteSpace(txtHoras.Text) ? int.Parse(txtHoras.Text) : new Nullable<int>(),
                        Anio = txtAnio.Text,
                        MontoTarifa = decimal.Parse(txtPrecio.Text),
                        MontoTarifaExt = moneda.ToUpper().Equals("EXTRANJERA") ? decimal.Parse(txtPrecio.Text) : (decimal.Parse(txtPrecio.Text) * tipoCambio),
                        MontoTarifaLoc = moneda.ToUpper().Equals("LOCAL") ? decimal.Parse(txtPrecio.Text) : (decimal.Parse(txtPrecio.Text) / tipoCambio),
                        Tarifa = decimal.Parse(txtValorVenta.Text),
                        TarifaExt = moneda.ToUpper().Equals("EXTRANJERA") ? decimal.Parse(txtValorVenta.Text) : (decimal.Parse(txtValorVenta.Text) * tipoCambio),
                        TarifaLoc = moneda.ToUpper().Equals("LOCAL") ? decimal.Parse(txtValorVenta.Text) : (decimal.Parse(txtValorVenta.Text) / tipoCambio),
                        Dscto = decimal.Parse(txtDescuento.Text),
                        DsctoExt = moneda.ToUpper().Equals("EXTRANJERA") ? decimal.Parse(txtDescuento.Text) : (decimal.Parse(txtDescuento.Text) * tipoCambio),
                        DsctoLoc = moneda.ToUpper().Equals("LOCAL") ? decimal.Parse(txtDescuento.Text) : (decimal.Parse(txtDescuento.Text) / tipoCambio),
                        ValorNeto = decimal.Parse(txtValorNeto.Text),
                        ValorNetoExt = moneda.ToUpper().Equals("EXTRANJERA") ? decimal.Parse(txtValorNeto.Text) : (decimal.Parse(txtValorNeto.Text) * tipoCambio),
                        ValorNetoLoc = moneda.ToUpper().Equals("LOCAL") ? decimal.Parse(txtValorNeto.Text) : (decimal.Parse(txtValorNeto.Text) / tipoCambio),
                        Impuestos = decimal.Parse(txtValorIGV.Text),
                        ImpuestosExt = moneda.ToUpper().Equals("EXTRANJERA") ? decimal.Parse(txtValorIGV.Text) : (decimal.Parse(txtValorIGV.Text) * tipoCambio),
                        ImpuestosLoc = moneda.ToUpper().Equals("LOCAL") ? decimal.Parse(txtValorIGV.Text) : (decimal.Parse(txtValorIGV.Text) / tipoCambio),
                        TarifaTotal = decimal.Parse(txtMontoTotal.Text),
                        TarifaTotalExt = moneda.ToUpper().Equals("EXTRANJERA") ? decimal.Parse(txtMontoTotal.Text) : (decimal.Parse(txtMontoTotal.Text) * tipoCambio),
                        TarifaTotalLoc = moneda.ToUpper().Equals("LOCAL") ? decimal.Parse(txtMontoTotal.Text) : (decimal.Parse(txtMontoTotal.Text) / tipoCambio),
                        DsctoEnDocumento = checkDsctoDocumento.Checked ? 1 : 0,
                        Activo = 1
                    };

                result = newCotizacionDetalle;
                this.Close();
            }
        }

        #region TextBoxes KeyPress
        private void txtAnio_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void txtCantidad_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar) || e.KeyChar == '.')
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void txtPrecio_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar) || e.KeyChar == '.')
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void txtDescuento_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar) || e.KeyChar == '.')
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void txtValorVenta_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar) || e.KeyChar == '.')
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void txtHoras_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar) || e.KeyChar == '.')
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        } 

        private void txtValDscto_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar) || e.KeyChar == '.')
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }
        #endregion

        private void CalcularValorVenta()
        {
            try
            {
                txtValorVenta.Text = (Convert.ToDecimal(txtCantidad.Text) * Convert.ToDecimal(txtPrecio.Text)).ToString("N");
            }
            catch (FormatException)
            {
                txtValorVenta.Text = "0.00";
            }
        }

        private void CalcularDescuento()
        {
            try
            {
                if (!string.IsNullOrWhiteSpace(txtValDscto.Text))
                {
                    txtDescuento.Text = ((Convert.ToDecimal(txtValorVenta.Text)) * (Convert.ToDecimal(txtValDscto.Text) / 100)).ToString("N");
                }
                else
                {
                    txtDescuento.Text = "0.00";
                }
            }
            catch (FormatException)
            {
                txtDescuento.ResetText();
            }
        }

        private void CalcularValorNeto()
        {
            try
            {
                txtValorNeto.Text = (Convert.ToDecimal(txtValorVenta.Text) - Convert.ToDecimal(txtDescuento.Text)).ToString("N");
            }
            catch (FormatException)
            {
                txtValorNeto.ResetText();
            }
        }

        private void CalcularIGV()
        {
            try
            {
                txtValorIGV.Text = (Convert.ToDecimal(txtValorNeto.Text) * 0.18m).ToString("N");
            }
            catch(FormatException)
            {
                txtValorIGV.ResetText();
            }
        }

        private void CalcularMontoTotal()
        {
            try
            {
                txtMontoTotal.Text = (Convert.ToDecimal(txtValorNeto.Text) + Convert.ToDecimal(txtValorIGV.Text)).ToString("N");
            }
            catch (FormatException)
            {
                txtMontoTotal.ResetText();
            }
        }

        private void txtCantidad_KeyUp(object sender, KeyEventArgs e)
        {
            CalcularValorVenta();
            CalcularDescuento();
            CalcularValorNeto();
            CalcularIGV();
            CalcularMontoTotal();
        }

        private void txtPrecio_KeyUp(object sender, KeyEventArgs e)
        {
            CalcularValorVenta();
            CalcularDescuento();
            CalcularValorNeto();
            CalcularIGV();
            CalcularMontoTotal();
        }

        private void txtValDscto_KeyUp(object sender, KeyEventArgs e)
        {
            CalcularValorVenta();
            CalcularDescuento();
            CalcularValorNeto();
            CalcularIGV();
            CalcularMontoTotal();
        }        
    }
}
